查看原文
其他

C、Java:我看着你们,满怀敬意

CPP开发者 2021-06-06

(给CPP开发者加星标,提升C/C++技能)

来源:开源中国

近日,TIOBE 公布了 2020 年 5 月的编程语言排行榜,C 语言时隔 5 年重返榜首,Java 和 Python 分列二、三位。



前段时间,B 站推出的青年节演讲视频《后浪》在朋友圈刷屏,看着“后浪”们丰富多彩的生活,同事们纷纷自嘲自己就是被拍在沙滩上的那一个,被生活疯狂蹂躏。然而在编程语言界,“后浪”们掀起的波澜则十分有限。与近年来陆续涌现的新兴编程语言相比,那些出道即巅峰、一巅几十年的“前浪”们,似乎还没有要退位让贤的意思。



在 TIOBE 公布的最新编程语言排行榜中,排名前十的语言中有 8 个诞生于上个世纪 90 年代,最“年轻”的是诞生于 2001 年的 C#,而位于榜首的 C 语言距今已有 48 年的历史。如果我们再来纵观自 2002 年以来的编程语言排行榜,基本上也还是这些老牌编程语言的身影,尤其是 C 与 Java 这两位“前浪”老大哥的江湖地位一直难以撼动。

 


数十年来,陆续出现的新兴编程语言不在少数,其中不乏一些以取代某种老语言为目的而设计的,那么这些编程语言界的“后浪”们,是否能够追上“前浪”们的脚步呢?下面不妨让我们来看看这些年编程界的知名“后浪”们。



前浪 C++(1979)VS 后浪 Go(2009)


诞生于 2009 年的 Go 语言堪称编程语言中的“星二代”。Go 的早期作者有三人,分别是 Rob Pike,Ken Thompson 和 Robert Griesemer,每一位的来头可都不小。



Rob Pike 曾是贝尔实验室的 Unix 团队以及 Plan 9 操作系统计划的成员,与 Thompson 共事多年,并共创出广泛使用的 UTF-8 字元编码;Ken Thompson 则是 B 语言、C 语言的作者,Unix 之父,1983 年图灵奖和 1998 年美国国家技术奖得主;而 Robert Griesemer 在开发 Go 之前是 Google V8、Chubby 和 HotSpot JVM 的主要贡献者。


2007 年,Rob Pike 认为 C++ 在 Google 分布式编译平台上的编译过程太过漫长,于是他和 Robert Griesemer 开始探讨 “简化编程语言相比于在臃肿的语言上不断增加新特性,会是更大的进步”。


两人一拍即合,随即说服了身边的 Ken Thompson,三人决定要捣鼓一门新语言。几天后,他们在 Google 内部发起了一个叫 Golang 的项目 。很快,一个在 C 语言基础上进行了优化的新语言诞生了,这就是 Go 。 


作为一个设计目的就是为了取代 C/C++ 的新语言,Go 的语法在很多地方借鉴了 C/C++ 。比如用花括号作为定界符,以分号作为语句结束等等,这使得 Go 很容易就能被精通 C/C++ 的开发人员接受。


而在沿袭 C/C++ 基本语法的基础上,Go 新加入了很多针对当下流行的分布式系统的实用功能,比如超轻量级的线程 goroutine,在高并发的系统中,可以按照多线程的方式写程序,从而保证逻辑的清晰和简单,又可以获得非常高的性能。


而同样的事情在 C++ 中则需要调用第三方框架,如果用多线程,会导致系统线程过多带来大量的上下文切换 overhead;如果采用基于消息的架构,虽然可以获得较高的效率,但程序逻辑会被打散,可读性和可维护性较差。


此外,Go 语言作为 Google 大力支持的“亲儿子”,拥有编译、测试、调试、性能分析等一整套成熟的工具,编译效率极高,再加上其还内置了 http、json、xml、正则表达式等很多后端系统开发中常用的库,可以说是一门已经非常成熟的工程化开发语言。


而在这方面,C++ 则需要用到大量的第三方开源工具或库,在工程上需要花费更多的精力进行技术选型,同时也不利于后期维护。


基于上述的优点,Go 语言被公认为非常适合构建命令行实用程序和网络服务等,尤其是云计算场景下的高并发应用,如今广泛流行的容器引擎 Docker、容器编排系统 Kubernetes 都是用 Go 编写的,Go 也因此被一些人称为“容器语言”。 


虽然 Go 在很多方面已经超越 C/C++,并且在云原生相关领域占有了一席之地,但是仍然难以撼动 C/C++ 语言在大量工业基础设施终端的地位。C/C++ 的优势仍然在于它的运行效率,如果是低级设备驱动程序、内核空间操作系统组件以及其他需要严格控制内存布局和管理的任务,C 依然是不二之选。 


目前,Go 在各种权威编程语言排行榜上都名列前茅,且一直呈上升趋势,在云原生建设如火如荼地当下,Go 至少在“云”这一领域已经完成了对前辈的超越。 



前浪 C++(1979) VS 后浪 Rust(2010)


Rust 是继 Go 之后另一个试图取代 C/C++ 的新语言。2010 年前后,随着大规模业务的拓展和分布式计算的流行,Graydon Hoare 也和 Rob Pike 一样看到了 C++ 等传统编程语言在高并发场景下的缺陷,试图创造更优秀的语言来替代它们。



Rust 原本是 Graydon 从 2006 年开始捣鼓的个人项目,随后该项目得到了 Mozzila 基金会的资助,而 Graydon 本人也于 2009 年加入 Mozzila 公司,带领团队完善 Rust 语言的开发。


2010 年,Mozzila 正式对外透露了 Rust 的存在。2013 年,Mozzila 基金会宣布将与三星合作,使用 Rust 语言开发一款浏览器引擎 Servo,成为首个使用 Rust 编写的大型项目。2015 年,Rust 首个 1.0 正式版发布。


Rust 最初是 Mozilla 为了解决软件在语言级别上无法真正利用多核计算带来的性能提升而创建的,这一点与 Go 有些类似。相比前辈 C++,Rust 在代码安全这一特性上下足了功夫。比如内存安全方面,Rust 在安全代码里不容许空指针、悬垂指针和数据竞争,这些问题在编译阶段就无法通过。


Rust 社区核心开发者 Nichols 表示:“之前,我们只能使用 C 或者 C++ 才能编写具有较低内存占用空间的高质量代码。但是,在生产代码中使用这些语言需要你手动管理内存并了解可能导致未定义行为的所有方法。”


Nichols 指出,不断扩展的 CVE 代码漏洞数据库证明,即使是最优秀的程序员也疲于应对层出不穷的代码漏洞。“为了确保你安全地使用内存,Rust 编译器非常严格,这样你就可以专注于你真正想要解决的问题。”  


尽管 Rust 凭借其代码安全的特性获得了部分开发者的青睐,但由于其无论是在性能还是语法上,均不足以颠覆 C/C++,再加上其学习曲线并不平滑,因此与“家大业大”的 Go 相比,Rust 在前期的发展不温不火。


直到去年 7 月,微软突然宣布将拥抱 Rust,探索用 Rust 作为 C/C++ 和其他语言的安全替代方案,以此来改善应用程序的安全状况。微软认为 Rust 是目前业界系统编程的最佳选择,原因不仅是它能够以内存安全的方式编写系统级程序,还在于其精密性。


微软此举让 Rust 在开发者中的地位直线上升,越来越多的企业和个人开始关注并重视代码安全的问题,从而重新审视这门新语言,这主要体现在 2020 年以来围绕 Rust 语言发生的几件事情:Linux 内核维护者表示愿意接受用 Rust 开发 Linux 驱动;AWS 宣布赞助 Rust;微软更进一步,在今年年初开发并开源了受 Rust 启发的新编程语言 Verona;最近,苹果也站出来拥抱它,计划将部分 C 代码移植到 Rust 。 


目前,Rust 语言的发展总体来说仍然比较缓慢,根据最新的一份调查报告显示,大多数不愿意接受 Rust 的开发者认为,Rust 目前的问题主要在于学习曲线陡峭、缺少所需的库、缺乏 IDE 支持等。可以说,Rust 的发展仍然任重道远。 



前浪 Objective-C(1986) VS 后浪 Swift(2014)


Swift 是为数不多的成功把“前浪”拍在沙滩上的“后浪”。


2010 年,或许是受到竞争对手 Google 推出 Go 的启示,Apple 高层也决定开发一套新的编程语言,用以替代使用了数十年的 Objective-C,而最早接到这个任务的人正是 Chris Lattner。



Chris 在大学还没毕业的时候就成为了业内知名的编译器专家,其硕士期间发表的论文奠定了 LLVM 框架的发展基础。在加入 Apple 公司以后,Chris 创造的 LLVM + Clang 成为了 Apple 软件产品的编译框架。而 Swift 语言就是 Chris 继 LLVM 与 Clang 之后的又一力作。 


Swift 是一门博采众长的现代语言,在设计的过程中,Chris 参考了 Objective-C、Rust、Haskell、Ruby、Python、C# 等语言的优点,最终形成了 Swift 的语法特性。


与前辈 OC 相比,Swift 的语法更加简洁,例如行尾不再需要分号,if/else 语句也不需要括弧,调用方法时 [ ] 也不再嵌套,支持字符串插入,省略了 OC 中的 %s,%d,%@ 等等。同时,Swift 把 oc 头文件 .h 和实现文件 .m 合并成了一个代码文件 .swift,使得Swift 代码更易于维护。


最重要的是,擅长优化的苹果工程师让 Swift 的运行速度能够逼近 C++,是 OC 运行速度的近 1.4 倍。在 Swift 诞生以后,苹果软件的开发者只需要维护原来一半量的代码文件,大大提高了开发效率,降低了维护成本。


目前,Swift 几乎已经完全取代 Objective-C ,成为苹果旗下 MacOS 、iOS 的主流开发语言,很多刚刚入行的 iOS 新人开发者甚至没有接触过 Objective-C 。不出意外的话,Objective-C 很有可能在不久的将来被人们逐渐遗忘。


然而 Swift 团队的目标似乎远不止于干掉老大哥这么简单,在即将发布的 5.3 版本中,Swift 将增加对 Windows 和其他 Linux 发行版 PC 操作系统的支持(目前仅支持 MacOS 和 Ubuntu),至于其后续发展如何,我们还将持续关注。



前浪 JavaScript(1995) VS 后浪 Dart (2011)


Dart 是 Google 工程师们继 Go 之后造的又一个轮子。与 Go 类似,Dart 最初也是一群 Google 工程师觉得 JavaScript 不太行,因此想要重新造一个更好的语言取代它,于是就有了 Dart 。



Google 工程师认为,JS 当初从设计到发布的时间极短(仅为 7 个月),在语言规范和谨慎性方面存在先天不足,比如语法过于松散、缺乏模块化能力、核心库不完备、编程语言范型不明确等,且难以用改良的方式来修复。


事实上,Google 工程师多年来也为改善 JavaScript 的性能做出了诸多贡献,特别是通过 V8 引擎强化了 JIT 对 JS 的编译能力,从而让 Chrome 浏览器的性能一骑绝尘。这足以说明当时的 JavaScript 在 Google 工程师眼里确实存在很多问题。


Dart 最初也是作为一种在浏览器中运行的脚本语言而生,Google 还专门在 Chrome 中内置了 一个 DartVM 引擎用来对 Dart 进行推广 。得益于 Chrome 庞大的用户体量,这一举措让 Dart 积累了规模可观的早期用户群体。


原以为在 Google 的保驾护航下,Dart 能够稳步发展并最终赶超 JavaScript。然而令 Google 没想到的是,半路竟杀出了一个 Node.js 。Node.js 是一个 JavaScript 运行环境,它让 JavaScript 可以开发后端程序,实现几乎其他后端语言实现的所有功能,这意味着 JavaScript 可以与 PHP、Java、Python、.NET、Ruby 等后端语言平起平坐。


从那时起,“ 凡是能用 JavaScript 写的应用终将用 JavaScript 来写 ”开始在圈内广为流传。值得一提的是,Node.js 正是基于 Google 自己的开源 JavaScript 引擎 V8 开发而来。


V8 本来是用于 Chrome 对 JavaScript 的解释器,鬼才 Ryan Dahl 把 V8 搬到了服务器上,用来做服务器的软件并取得了成功。在往后的几年里,前端开发的模式因 JavaScript 而改变,React、React-Native、Vue 等基于 JavaScript 的明星项目迅速崛起,Dart 逐渐被人们遗忘在角落。


然而 Google 一直没有放弃 Dart 。2018 年,Google 对 Dart 进行了底层重构,并于 8 月推出了 Dart 2.0 版本,将其重新定义为一种同时支持 Web 和移动客户端开发、具有丰富工具箱和组件的语言。


同年 12 月,Google 发布了用 Dart 编写的跨平台应用开发工具 Flutter,让 Dart 能够在服务端编写命令行程序,同时在前端可以编译成 JavaScript 运行在浏览器中。随后,Google 开始新一轮发力推广全新的 Dart ,包括为另一个知名前端框架 Angular 推出对应的 Dart 版本,指定 Dart 作为未来的操作系统 Fuchsia 的官方开发语言等,Dart 社区又焕发了勃勃生机。


可以说在刚刚诞生的前几年里,作为一门运行在浏览器中的脚本语言,Dart 是完败于前辈 JavaScript 的。而如今乘着“大前端”的变革浪潮,要说超越 JavaScript 虽然也不太现实(毕竟“凡是能用 JavaScript 写的东西终将用 JavaScript 来写” ),但 Dart 在未来一段时间里还是一个非常有潜力的“后浪”代表。



前浪 Java(1995) VS 后浪 Kotlin (2011)


Kotlin 是 Google 公司继 Go 之后又一力捧的新编程语言。Kotlin 诞生于 2010 年,出自 JetBrains,并于2012年正式开源。Kotlin 最初的设计目的是为了创建一种兼容 Java 的编程语言,并让它比 Java 更好。 



作为一门相对比较新的 JVM 语言,Kotlin 得到了 Google 公司的大力支持。2017年,Google 在 I/O 开发者大会上官宣 Kotlin 正式成为 Android 官方开发语言 。两年后的 I/O 大会上,Google 再次加码 Kotlin,宣布其成为 Andoid 开发官方首选语言。


Kotlin 的语法融合了 Scala、Groovy、Python、Swift 等众多语言的特性,如果使用过其中任意一门语言,上手 Kotlin 将非常容易。与 Java 相比,Kotlin 引入了函数式编程方式,同时有各种语法糖简化了代码量。


但与其他试图取代“前浪”的新语言不同,Kotlin 走的是一条 100% 兼容 Java 的道路(打不过就加入)。众所周知,Java 这么多年屹立不倒的原因是因为其发展多年积累的庞大生态,包括丰富的函数库、IDE、编译器、成熟的应用生态等等。Kotlin 则可以调用 Java 的绝大多数库,也就可以直接使用 Java 现有的生态,因此很多开发者选择混用 Kotlin 与 Java。 


由于采用的是与前辈和谐共生的模式,目前 Kotlin 已经超越 Scala 和 Clojure,成为 JVM 上第二大受欢迎的语言,尤其是在安卓开发领域得到了很多国内外开发者的认可,也是一个非常有前景的优秀“后浪”。



结语


这些 21 世纪以后(2010 年前后)以取代老语言为目的而诞生的新语言中,能够顺利取代“前浪”的语言屈指可数。有的乘着新技术的东风在某一新兴领域成为了行业标杆。有的在与“前浪”的和谐共生中猥琐发育,静待日后的逆袭。当然,更多的是消逝在了历史的长河里,甚至没有泛起一丝涟漪……


究其原因,如今仍然流行的语言诸如 C/C++、Java、Python、JavaScript 等等,虽然它们大多数诞生于上个世纪,但它们一直以来也都在针对新时代的需求不断地优化,经历了数十个甚至上百个版本的更迭,很多语言已经与诞生之初完全不一样了。再加上它们数十年来积累的函数库、IDE 、编译器、应用生态等自成一脉的丰富体系,让“后浪”们难以望其项背。


从商业的角度来说,在行业格局没有发生颠覆性变革的时候,现有的热门语言依靠多年积累的庞大用户基础,就足以形成垄断。就算有更好的新语言出现,它们也可以迅速吸收这些新语言的优良特性,就像大企业兼并小企业,或者直接照搬它们优秀的业务功能一样,让自己变得更好,也更容易被大部分开发者接受。所以要想在编程语言界把“前浪”们拍在沙滩上,“后浪”们要走的路还有很长很长。


最后,千言万语汇成一道填空题:

______ 是世界上最好的语言!


推荐阅读  点击标题可跳转

48 岁的 C 语言,你知道它背后的历史吗?

Java vs C++:子类覆盖父类函数时缩小可访问性的不同设计

C 和 Java,物联网开发的主要编程语言


看完本文有帮助?请分享给更多人

关注「CPP开发者」加星标,提升C/C++技能

好文章,我在看❤️

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存